home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 49 / Amiga Format CD49 (2000-01-17)(Future Publishing)(GB)(Track 1 of 3)[!][issue 2000-02].iso / -in_the_mag- / pdselect / jpeg-dt / jpeg-dt35 / source / libbase.c < prev    next >
C/C++ Source or Header  |  1999-11-15  |  3KB  |  191 lines

  1. #include <clib/alib_protos.h>
  2. #include <pragma/exec_lib.h>
  3. #include <pragma/intuition_lib.h>
  4. #include <dos/dos.h>
  5. #include <exec/resident.h>
  6. #include "class.h"
  7.  
  8. #define VERSION 46
  9. #define REVISION 0
  10.  
  11. struct ClassBase:Library
  12. {
  13. BPTR cb_SegList;
  14. IClass *cb_Class;
  15. SignalSemaphore cb_Lock;
  16. };
  17.  
  18. extern APTR Dispatcher;
  19. extern ULONG InitTab[];
  20. extern APTR LibVectors[];
  21. extern char LibName[];
  22. extern char LibId[];
  23.  
  24. ClassBase *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase);
  25. ClassBase *LibOpen(register __a6 ClassBase *cb);
  26. ULONG LibClose(register __a6 ClassBase *cb);
  27. ULONG LibExpunge(register __a6 ClassBase *cb);
  28. IClass *ObtainClass(register __a6 ClassBase *cb);
  29.  
  30. BOOL L_OpenLibs();
  31. void L_CloseLibs();
  32. IClass *InitClass(ClassBase *cb);
  33.  
  34. static LONG LibExtFunc()
  35. {
  36. return -1;
  37. }
  38.  
  39. static Resident RomTag=
  40. {
  41. RTC_MATCHWORD,
  42. &RomTag,
  43. &RomTag+sizeof(RomTag),
  44. RTF_AUTOINIT,
  45. VERSION,
  46. NT_LIBRARY,
  47. 0,
  48. LibName,
  49. LibId,
  50. &InitTab
  51. };
  52.  
  53. char LibName[]="jpeg.datatype";
  54. char LibId[]="$VER:jpeg.datatype 46.0 (13.11.99) © 1999 by Achim Stegemann\n";
  55.  
  56. APTR LibVectors[]=
  57. {
  58. LibOpen,
  59. LibClose,
  60. LibExpunge,
  61. LibExtFunc,
  62. ObtainClass,
  63. APTR(-1),
  64. };
  65.  
  66. ULONG InitTab[]=
  67. {
  68. sizeof(ClassBase),
  69. ULONG(LibVectors),
  70. 0,
  71. ULONG(LibInit)
  72. };
  73.  
  74. Library *SysBase;
  75. Library *DOSBase;
  76. Library *IntuitionBase;
  77. Library *GfxBase;
  78. Library *UtilityBase;
  79. Library *DataTypesBase;
  80. Library *SuperClassBase;
  81. Library *JpegBase;
  82.  
  83. ClassBase *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase)
  84. {
  85. SysBase=sysbase;
  86. cb->lib_Revision=REVISION;
  87. cb->cb_SegList=Segment;
  88. InitSemaphore(&cb->cb_Lock);
  89. return cb;
  90. }
  91.  
  92. ClassBase *LibOpen(register __a6 ClassBase *cb)
  93. {
  94. ClassBase *ret=0;
  95. cb->lib_Flags&=~LIBF_DELEXP;
  96. ObtainSemaphore(&cb->cb_Lock);
  97. if(!cb->cb_Class)
  98.     {
  99.     if(L_OpenLibs())
  100.         {
  101.         if(cb->cb_Class=InitClass(cb)) ret=cb;
  102.         }
  103.     }
  104. else ret=cb;
  105. if(ret) cb->lib_OpenCnt++;
  106. ReleaseSemaphore(&cb->cb_Lock);
  107. return ret;
  108. }
  109.  
  110. ULONG LibClose(register __a6 ClassBase *cb)
  111. {
  112. if(cb->lib_OpenCnt) cb->lib_OpenCnt--;
  113. return (!cb->lib_OpenCnt&&cb->lib_Flags&LIBF_DELEXP)?LibExpunge(cb):0;
  114. }
  115.  
  116. ULONG LibExpunge(register __a6 ClassBase *cb)
  117. {
  118. if(!cb->lib_OpenCnt)
  119.     {
  120.     if(cb->cb_Class) 
  121.         {
  122.         if(!FreeClass(cb->cb_Class))
  123.             {
  124.             AddClass(cb->cb_Class);
  125.             return 0;
  126.             }
  127.         }
  128.     L_CloseLibs();
  129.     Remove(cb);
  130.     FreeMem((BYTE *)cb-cb->lib_NegSize,cb->lib_NegSize+cb->lib_PosSize);
  131.     return cb->cb_SegList;
  132.     }
  133. else cb->lib_Flags|=LIBF_DELEXP;
  134. return 0;
  135. }
  136.  
  137. IClass *InitClass(ClassBase *cb)
  138. {
  139. IClass *cl;
  140. if(cl=MakeClass(LibName,"picture.datatype",0,sizeof(Data),0))
  141.     {
  142.     cl->h_Entry=&HookEntry;
  143.     cl->h_SubEntry=&Dispatcher;
  144.     cl->cl_UserData=ULONG(cb);
  145.     AddClass(cl);
  146.     }
  147. return cl;
  148. }
  149.  
  150. BOOL L_OpenLibs()
  151. {
  152. if(DOSBase=OpenLibrary("dos.library",40))
  153.     {
  154.     if(GfxBase=OpenLibrary("graphics.library",40))
  155.         {
  156.         if(IntuitionBase=OpenLibrary("intuition.library",40))
  157.             {
  158.             if(UtilityBase=OpenLibrary("utility.library",40))
  159.                 {
  160.                 if(DataTypesBase=OpenLibrary("datatypes.library",44))
  161.                     {
  162.                     if(SuperClassBase=OpenLibrary("datatypes/picture.datatype",44))
  163.                         {
  164.                         if(JpegBase=OpenLibrary("jpeg.library",5)) return 1;
  165.                         }
  166.                     }
  167.                 }
  168.             }
  169.         }
  170.     }
  171. L_CloseLibs();
  172. return 0;
  173. }
  174.  
  175. void L_CloseLibs()
  176. {
  177. CloseLibrary(DOSBase);
  178. CloseLibrary(IntuitionBase);
  179. CloseLibrary(GfxBase);
  180. CloseLibrary(UtilityBase);
  181. CloseLibrary(DataTypesBase);
  182. CloseLibrary(SuperClassBase);
  183. CloseLibrary(JpegBase);
  184. }
  185.  
  186. IClass *ObtainClass(register __a6 ClassBase *cb)
  187. {
  188. return cb->cb_Class;
  189. }
  190.  
  191.